/* { dg-do compile { target arm*-*-* } } */
/* { dg-skip-if "incompatible options" { ! { arm_thumb1_ok || arm_thumb2_ok } } } */
/* { dg-options "-fno-short-enums -O2 -mthumb -march=armv7-a -mfpu=neon -mfloat-abi=softfp -mtune=cortex-a9 -fno-section-anchors -Wno-return-type" } */

typedef unsigned int size_t;
__extension__ typedef int __intptr_t;
typedef __intptr_t intptr_t;
typedef union tree_node *tree;
typedef const union tree_node *const_tree;
extern void *ggc_internal_cleared_alloc_stat (size_t )
  __attribute__ ((__malloc__));
enum tree_code {
TREE_LIST=2,
FUNCTION_DECL,
MAX_TREE_CODES=254
};
extern unsigned char tree_contains_struct[MAX_TREE_CODES][64];
struct tree_base {
  enum tree_code code : 16;
};
struct tree_common {
  tree chain;
};
enum tree_node_structure_enum {
TS_COMMON,
TS_DECL_COMMON,
};
extern void tree_contains_struct_check_failed (const_tree,
            const enum tree_node_structure_enum,
            const char *, int, const char *)
  __attribute__ ((__noreturn__));
extern void tree_check_failed (const_tree, const char *, int, const char *,
          ...) __attribute__ ((__noreturn__));
struct tree_list {
  tree value;
};
struct tree_decl_common {
  tree initial;
};
struct tree_function_decl {
  struct function *f;
};
union
                                                         tree_node {
  struct tree_base base;
  struct tree_common common;
  struct tree_decl_common decl_common;
  struct tree_function_decl function_decl;
  struct tree_list list;
};
inline tree
tree_check (tree __t, const char *__f, int __l, const char *__g, enum tree_code __c)
{
  if (((enum tree_code) (__t)->base.code) != __c)
    tree_check_failed (__t, __f, __l, __g, __c, 0);
}
inline tree
contains_struct_check (tree __t, const enum tree_node_structure_enum __s,
                       const char *__f, int __l, const char *__g)
{
  if (tree_contains_struct[((enum tree_code) (__t)->base.code)][__s] != 1)
      tree_contains_struct_check_failed (__t, __s, __f, __l, __g);
}
struct function {
  tree static_chain_decl;
};
enum gimple_code {
    LAST_AND_UNUSED_GIMPLE_CODE
};
struct eh_catch_d
{
  struct eh_catch_d *next_catch;
  struct eh_catch_d *prev_catch;
  tree type_list;
  tree filter_list;
  tree label;
};
struct eh_region_d
{
  struct eh_region_d *outer;
  struct eh_region_d *inner;
  int index;
  union eh_region_u {
    struct eh_region_u_try {
      struct eh_catch_d *first_catch;
    } eh_try;
  } u;
};
typedef struct eh_catch_d *eh_catch;
typedef struct eh_region_d *eh_region;
extern void add_type_for_runtime (tree);
enum LTO_tags
{
  LTO_null = 0,
  LTO_bb0 = 1 + MAX_TREE_CODES + LAST_AND_UNUSED_GIMPLE_CODE,
  LTO_ert_cleanup,
  LTO_NUM_TAGS
};
enum lto_section_type
{
  LTO_section_function_body,
};
struct lto_input_block
{
  const char *data;
  unsigned int p;
  unsigned int len;
};
extern void lto_section_overrun (struct lto_input_block *) __attribute__ ((__noreturn__));
extern void lto_value_range_error (const char *,
       long long, long long,
       long long) __attribute__ ((__noreturn__));
long long streamer_read_hwi (struct lto_input_block *);
static inline unsigned char
streamer_read_uchar (struct lto_input_block *ib)
{
  if (ib->p >= ib->len)
    lto_section_overrun (ib);
  return (ib->data[ib->p++]);
}
static inline long long
streamer_read_hwi_in_range (struct lto_input_block *ib,
     const char *purpose,
     long long min,
     long long max)
{
  long long range = max - min;
  long long val = streamer_read_uchar (ib);
  if (range >= 0xff)
    val |= ((long long)streamer_read_uchar (ib)) << 8;
  if (val < min || val > max)
    lto_value_range_error (purpose, val, min, max);
  return val;
}
static inline enum LTO_tags
streamer_read_record_start (struct lto_input_block *ib)
{
  return (enum LTO_tags)streamer_read_hwi_in_range ((ib), "LTO_tags", 0, (int)(LTO_NUM_TAGS) - 1);
}
struct streamer_hooks {
  tree (*read_tree) (struct lto_input_block *, struct data_in *);
};
extern struct streamer_hooks streamer_hooks;
static struct eh_catch_d *
lto_input_eh_catch_list (struct lto_input_block *ib, struct data_in *data_in,
    eh_catch *last_p)
{
  eh_catch first;
  enum LTO_tags tag;
  *last_p = first = __null;
  tag = streamer_read_record_start (ib);
  while (tag)
    {
      tree list;
      eh_catch n;
      n = ((struct eh_catch_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct eh_catch_d) )));
      n->type_list = streamer_hooks.read_tree(ib, data_in);
      n->filter_list = streamer_hooks.read_tree(ib, data_in);
      n->label = streamer_hooks.read_tree(ib, data_in);
      for (list = n->filter_list; list; list = ((contains_struct_check ((list), (TS_COMMON), "../../../gcc-4.8~svn195526/gcc/lto-streamer-in.c", 275, __FUNCTION__))->common.chain))
 add_type_for_runtime (((tree_check ((list), "../../../gcc-4.8~svn195526/gcc/lto-streamer-in.c", 276, __FUNCTION__, (TREE_LIST)))->list.value));
      if (*last_p)
 (*last_p)->next_catch = n;
      n->prev_catch = *last_p;
      *last_p = n;
      if (first == __null)
 first = n;
      tag = streamer_read_record_start (ib);
    }
  return first;
}
static eh_region
input_eh_region (struct lto_input_block *ib, struct data_in *data_in, int ix)
{
  enum LTO_tags tag;
  eh_region r;
  tag = streamer_read_record_start (ib);
  if (tag == LTO_null)
    return __null;
  r = ((struct eh_region_d *)(ggc_internal_cleared_alloc_stat (sizeof (struct eh_region_d) )));
  r->index = streamer_read_hwi (ib);
  r->outer = (eh_region) (intptr_t) streamer_read_hwi (ib);
  r->inner = (eh_region) (intptr_t) streamer_read_hwi (ib);
  switch (tag)
    {
      case LTO_ert_cleanup:
 {
   struct eh_catch_d *last_catch;
   r->u.eh_try.first_catch = lto_input_eh_catch_list (ib, data_in,
            &last_catch);
 }
 {
   tree l;
     add_type_for_runtime (((tree_check ((l), "../../../gcc-4.8~svn195526/gcc/lto-streamer-in.c", 346, __FUNCTION__, (TREE_LIST)))->list.value));
 }
    }
}
static void
input_eh_regions (struct lto_input_block *ib, struct data_in *data_in,
    struct function *fn)
{
  long long i, root_region, len;
  enum LTO_tags tag;
  tag = streamer_read_record_start (ib);
  if (tag == LTO_null)
    return;
  len = streamer_read_hwi (ib);
  if (len > 0)
    {
      for (i = 0; i < len; i++)
 {
   eh_region r = input_eh_region (ib, data_in, i);
 }
    }
}
static void
input_ssa_names (struct lto_input_block *ib, struct data_in *data_in,
   struct function *fn)
{
  unsigned int i, size;
  while (i)
    {
    }
}
static void
input_struct_function_base (struct function *fn, struct data_in *data_in,
                            struct lto_input_block *ib)
{
  fn->static_chain_decl = streamer_hooks.read_tree(ib, data_in);
}
static void
input_function (tree fn_decl, struct data_in *data_in,
  struct lto_input_block *ib)
{
  struct function *fn;
  enum LTO_tags tag;
  fn = ((tree_check ((fn_decl), "../../../gcc-4.8~svn195526/gcc/lto-streamer-in.c", 807, __FUNCTION__, (FUNCTION_DECL)))->function_decl.f);
  tag = streamer_read_record_start (ib);
  input_struct_function_base (fn, data_in, ib);
  input_ssa_names (ib, data_in, fn);
  input_eh_regions (ib, data_in, fn);
  ((contains_struct_check ((fn_decl), (TS_DECL_COMMON), "../../../gcc-4.8~svn195526/gcc/lto-streamer-in.c", 823, __FUNCTION__))->decl_common.initial) = streamer_hooks.read_tree(ib, data_in);
}
static void
lto_read_body (struct lto_file_decl_data *file_data, tree fn_decl,
        const char *data, enum lto_section_type section_type)
{
  struct data_in *data_in;
  struct lto_input_block ib_main;
  input_function (fn_decl, data_in, &ib_main);
}
void
lto_input_function_body (struct lto_file_decl_data *file_data,
    tree fn_decl, const char *data)
{
  lto_read_body (file_data, fn_decl, data, LTO_section_function_body);
}

